#!/bin/bash

echo ===========================================================
echo =================== 自动化部署脚本发布 ====================
echo ===========================================================

GIT_ADDR=https://gitee.com/chichengyu/demo2.git # git仓库地址,需要手动修改
APP_NAME=bale # 项目打包模块路径(最终target所在目录),需要手动修改,如:仓库根目录/父工程/子工程
APPLICATION_NAME=$APP_NAME.jar # jar包名称,需要手动修改
PORT=9000 # 项目端口,需要手动修改

FILE_NAME=$(basename $0) #不用修改,当前执行脚本文件名称
APP_DIR=$(cd $(dirname $0);pwd)/$APP_NAME #不用修改
APP_PATH=$APP_DIR/target/$APPLICATION_NAME #不用修改

colors='\033[33m'
colore='\033[0m'

echo ======================= 项目信息 ==========================
echo -e "git仓库地址(${colors}修改${colore})：${colors} ${GIT_ADDR} ${colore}"
echo -e "打包工程目录(${colors}修改${colore})：${colors} ${APP_NAME} ${colore}"
echo -e "项目应用名称(${colors}修改${colore})：${colors} ${APPLICATION_NAME} ${colore}"
echo -e "项目运行端口(${colors}修改${colore})：${colors} ${PORT} ${colore}"
echo -e "项目应用目录：${colors} ${APP_DIR} ${colore}"
echo -e "项目应用路径：${colors} ${APP_PATH} ${colore}"
echo -e "脚本文件名称：${colors} ${FILE_NAME} ${colore}"
echo ===========================================================

usage() {
    echo -e "***使用说明***: 
     1.自动：${colors} sh ${FILE_NAME} auto ${colore}(一键自动部署)
     2.克隆：${colors} sh ${FILE_NAME} clone ${colore}
     3.拉取：${colors} sh ${FILE_NAME} pull ${colore}
     4.启动：${colors} sh ${FILE_NAME} start ${colore}
     5.停止：${colors} sh ${FILE_NAME} stop ${colore}
     6.重启：${colors} sh ${FILE_NAME} restart ${colore}
     7.状态：${colors} sh ${FILE_NAME} status ${colore}"
    exit 1
}
is_exist(){
  pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}' `
  if [ -z "${pid}" ]; then
    return 1
  else
    return 0
  fi
}
start(){
  is_exist
  if [ $? -eq "0" ]; then
    echo -e "项目${colors} ${APP_PATH} ${colore}正在运行。
-----> 项目进程${colors} pid=${pid} ${colore}.
       停止项目：${colors} sh bootstart.sh stop ${colore}"
  else
    if [[ -f  $APP_PATH ]]; then
      echo -e "项目jar包文件 ${colors} $APP_PATH ${colore} 存在, 正在启动..."
      #nohup java -server -Xms2048m -Xmx2048m -Xmn680m -Xloggc:./logs/gc.log -jar $APP_PATH > /dev/null 2>&1 &
      START_LOG_PATH=$FILE_NAME.log
      nohup java -server -Xms512m -Xmx512m -Xmn128m -Xloggc:./logs/gc.log -jar $APP_PATH > $START_LOG_PATH 2>&1 &
      echo -e "项目${colors} $APP_PATH ${colore}启动成功，请查看日志确保运行正常,日志目录：${colors} $APP_DIR ${colore}
-----> 项目端口：${colors} "$PORT" ${colore},状态：${colors} sh ${FILE_NAME} status ${colore},请检查防火墙端口开放情况：
       开放端口：${colors} firewall-cmd --zone=public --add-port=$PORT/tcp --permanent ${colore}
       重启防火墙：${colors} firewall-cmd --reload ${colore}
       查看端口号是否开启：${colors} firewall-cmd --query-port=$PORT/tcp ${colore}"
      if [ -f $START_LOG_PATH ];then
         tail -f $START_LOG_PATH
      fi
    else
      echo -e "项目jar包文件${colors} $APP_PATH ${colore}不存在,
-----> 请先顺序执行：
       克隆项目：${colors} sh ${FILE_NAME} clone ${colore}
       拉取代码：${colors} sh ${FILE_NAME} pull ${colore}
       打包项目：${colors} sh ${FILE_NAME} package ${colore}"
    fi
  fi
}
stop(){
  is_exist
  if [ $? -eq "0" ]; then
    kill -9 $pid
    echo -e "项目：${colors} ${APP_PATH} ${colore} 已停止 
-----> 进程pid ${colors} ${pid} ${colore} 进程已被杀死，程序停止运行"
  else
    echo -e "项目：${colors} ${APP_PATH} ${colore} 没有运行。"
  fi
  echo -e "-----> 启动项目：${colors} sh ${FILE_NAME} start ${colore}
       项目状态：${colors} sh ${FILE_NAME} status ${colore}"
}
status(){
  is_exist
  if [ $? -eq "0" ]; then
    echo -e "项目：${colors} ${APP_PATH} ${colore} 正在运行。Pid is ${colors} ${pid} ${colore}"
  else
    echo -e "项目：${colors} ${APP_PATH} ${colore} 没有运行。"
  fi
  echo -e "-----> 启动项目：${colors} sh ${FILE_NAME} start ${colore}
       重启项目：${colors} sh ${FILE_NAME} restart ${colore}
       停止项目：${colors} sh ${FILE_NAME} stop ${colore}"
}
restart(){
  stop
  start
}
clone(){
  if [ $GIT_ADDR ]; then
    echo -e "开始克隆仓库,git仓库地址：${colors} ${GIT_ADDR} ${colore}"
    git clone $GIT_ADDR
    echo -e "克隆仓库完成,请执行打包：${colors} sh ${FILE_NAME} package ${colore}"
  else
    echo -e "请先修改${FILE_NAME}文件中的git地址：${colors} GIT_ADDR=$GIT_ADDR ${colore}"
  fi
}
pull(){
  if [[ -d $APP_DIR ]]; then
    echo -e "开始拉取git仓库最新代码,git仓库地址：${colors} $GIT_ADDR ${colore}"
    cd $APP_DIR
    git pull
    echo -e "拉取完成,请执行打包：${colors} sh ${FILE_NAME} package ${colore}"
  else
    echo -e "git项目仓库目录：${colors} $APP_DIR ${colore}不存在
请先克隆git仓库,当前git仓库地址：${colors} $GIT_ADDR ${colore}
-----> 执行克隆：${colors} sh ${FILE_NAME} clone ${colore} (方式一)
          ${colors} git clone $GIT_ADDR ${colore} (方式二)"
  fi
}
package(){
  if [[ -d $APP_DIR ]]; then
    cd $APP_DIR
    echo -e "进入项目根目录：${colors} $APP_DIR ${colore},请确定是仓库最新代码：${colors} sh ${FILE_NAME} pull ${colore}, 开始打包
    打包命令：${colors} mvn clean package -Dmaven.test.skip=true ${colore}, 正在打包..."
    output=`mvn clean package -Dmaven.test.skip=true`
    echo -e "打包完成,路径：${colors} $APP_PATH ${colore}
-----> 启动项目：${colors} sh ${FILE_NAME} start ${colore}
       重启项目：${colors} sh ${FILE_NAME} restart ${colore}"
  else
    echo -e "git项目仓库目录：${colors} $APP_DIR ${colore}不存在请先克隆git仓库,当前git仓库地址：${colors} $GIT_ADDR ${colore}
-----> 执行克隆：${colors} sh ${FILE_NAME} clone ${colore} (方式一)
                 ${colors} git clone $GIT_ADDR ${colore} (方式二)"
  fi
}
auto(){
  echo "一键自动化部署"
  stop
  if [ -d $APP_DIR ]; then
    pull
    package
    restart
  else
    clone
    package
    start
  fi
}

case "$1" in
  "auto")
    auto
    ;;
  "clone")
    clone
    ;;
  "pull")
    pull
    ;;
  "package")
    package
    ;;
  "start")
    start
    ;;
  "stop")
    stop
    ;;
  "status")
    status
    ;;
  "restart")
    restart
    ;;
  *)
    usage
    ;;
esac

